df['ext price'].value_counts(bins=4, sort=False)
#res
(55603.988000000005, 87998.212] 5
(87998.212, 120263.375] 12
(120263.375, 152528.538] 2
(152528.538, 184793.7] 1
Name: ext price, dtype: int64
pd.interval_range(start=0, freq=10000, end=200000, closed='left')
#res
IntervalIndex([[0, 10000), [10000, 20000), [20000, 30000), [30000, 40000), [40000, 50000) ... [150000, 160000),
[160000, 170000), [170000, 180000), [180000, 190000), [190000, 200000)],
closed='left',
dtype='interval[int64]')
interval_range = pd.interval_range(start=0, freq=10000, end=200000)
df['cut_ex2'] = pd.cut(df['ext price'], bins=interval_range, labels=[1,2,3])
df.head()
#There is a downside to using interval_range . You can not define custom labels.
pd.cut(df['ext price'], bins=4).value_counts() #bin range size afre equal
#res
(87998.212, 120263.375] 12 #different no. of observation
(55603.989, 87998.212] 5
(120263.375, 152528.538] 2
(152528.538, 184793.7] 1
Name: ext price, dtype: int64
#If you want equal distribution of the items in your bins, use qcut . If you want to define your own numeric bin ranges, then use cut .
\
df['quantile_ex_4'] = pd.qcut(df['ext price'],
q=[0, .2, .4, .6, .8, 1], #quartiles bin range will vary
labels=False, #returns integers as categories
precision=0)
df.head()
#all bins will have roughly same no. of observation